/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.ipti.br.tag.bean;

import java.io.Serializable;
import java.util.Calendar;
import javax.faces.application.FacesMessage;
import javax.faces.context.*;
import javax.servlet.http.*;

/**
 *
 * @author israel
 */
public class AppBaseBean implements Serializable{
    /**
     * Atributo (privado) para obter a transação do usuário
     */

    /**
     * Campo em Branco (String)
     */
    protected static final String FIELD_BLANK = "";

    /**
     * Campo em Branco (Inteiro)
     */
    protected static final int FIELD_BLANK_INTEGER = Integer.MAX_VALUE;

    /**
     * Campo em Branco (Booleano)
     */
    protected static final boolean FIELD_BLANK_BOOLEAN = false;

    /**
     * Permite obter o contexto atual de Java Server Faces
     * @return Contexto de Java Server Faces
     */
    
    protected static final String DOMAIN = "http://localhost:8080/TAG/";
//    protected static final String DOMAIN = "http://ttag.ipti.org.br/staluzia/";
//    protected static final String DOMAIN = "http://tag.ipti.org.br/";
    
    protected Calendar actual = Calendar.getInstance();
    
    protected FacesContext getFacesContext() {
        return FacesContext.getCurrentInstance();
    }

    protected void addErrorMessage(String alvo,String titulo,String mensagem){
        getFacesContext().addMessage(alvo, new FacesMessage(FacesMessage.SEVERITY_ERROR, titulo, mensagem));
    }

    protected void addInfoMessage(String alvo,String titulo,String mensagem){
        getFacesContext().addMessage(alvo, new FacesMessage(FacesMessage.SEVERITY_INFO, titulo, mensagem));
    }

    /**
     * Método para obter o indicador se foi feito uma ação HTTP POST na página ou não
     * @return Indicador se foi feito postback ou não
     */
    protected boolean isPostBack(){
        return this.getFacesContext().isPostback();
    }

    /**
     * Método que permite obter o contexto externo à aplicação JSF
     * @return Retorno contexto externo a aplicação JSF
     */
    protected ExternalContext getExternalContext() {
        return this.getFacesContext().getExternalContext();
    }
    
    protected String getParameter(String param) {
        return getExternalContext().getRequestParameterMap().get(param);
    }
    
//    @Produces @HttpParameter("")
//    public Object getParameter(InjectionPoint injectionPoint) throws IllegalAccessException, InstantiationException {
//        String param = injectionPoint.getAnnotated().getAnnotation(HttpParameter.class).value();
//        AbstractEntity ab = (AbstractEntity) injectionPoint.getMember().getDeclaringClass().newInstance();
//        ab.setId(Long.parseLong(getExternalContext().getRequestParameterMap().get(param)));
//        return ab;
//    }

    /**
     * Método para obter referência de uma requisição
     * @return Retorna a referência de uma requisição
     */
    protected HttpServletRequest getRequest() {
        return (HttpServletRequest)this.getExternalContext().getRequest();
    }

    /**
     * Método para obter referência de uma reposta
     * @return Retorna a referência de uma resposta
     */
    protected HttpServletResponse getResponse() {
        return (HttpServletResponse)this.getExternalContext().getResponse();
    }

    /**
     * Método para obter sessão do usuário
     * @return Referência de sessão
     */
    protected HttpSession getSession() {
        return this.getRequest().getSession();
    }

    /**
     * Método para obter sessão do usuário
     * @param create Indica se é para criar uma nova sessão ou não
     * @return Referência de sessão
     */
    protected HttpSession getSession(boolean create) {
        return this.getRequest().getSession(create);
    }
    
    protected void resetSession(){
        getSession(true).invalidate();
    }

    protected void redirect(String url) {
        try {
            this.getFacesContext().getExternalContext().redirect(DOMAIN+url);
        } catch (Exception e) {
        }
    }

    protected static String getDOMAIN() {
        return DOMAIN;
    }

    public Calendar getActualCalendar() {
        return actual;
    }
    
    public Integer getActualYear() {
        return actual.get(Calendar.YEAR);
    }
}
